package pildemil

import com.google.appengine.api.datastore.*

class ProjetController {

	def persistenceManager

	static allowedMethods = [ajouter:'POST', sauver:'POST']

	def index = {
		 if (params.projetKey) {
			try {
				def projetKey = KeyFactory.stringToKey(params.projetKey)
				Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
				session.projetKey = params.projetKey
				redirect(controller:'transaction', action:'liste')	
			} catch(Exception e) {
				def message = "Hmmm... Le projet est introuvable. Il a surement été supprimé."
				render(view:"accueil", model:['message':message])
			}
		} else if (session.projetKey) {
			redirect('action':editer)
		} else {
			redirect('action':accueil)
		}
	}
	
	def accueil = {
		render(view:"accueil")
	}
	
	def creer = {
		def projet = new Projet()
		projet.nom = params.nomProjet
		
		Participant responsable = new Participant()
		responsable.nom = params.nom
		responsable.email = params.email
		
		render(view:"creer", model:['projet':projet, 'responsable':responsable])
	}

	def ajouter = {
		Projet projet = new Projet()
		projet.nom = params.nomProjet
		
		Participant responsable = new Participant()
		responsable.nom = params.nom
		responsable.email = params.email
		responsable.estResponsable = true
		responsable.projet = projet
			
		def transaction = persistenceManager.currentTransaction()

		try {
			transaction.begin()
			persistenceManager.makePersistent(projet)
			persistenceManager.makePersistent(responsable)
			projet.participants << responsable
			projet.responsable = responsable.key
			persistenceManager.makePersistent(projet)
			transaction.commit()

			session.projetKey = KeyFactory.keyToString(projet.key)
			redirect(controller:"participant", action:"liste")
		} catch(e) {
			if (transaction.isActive()) { transaction.rollback(); }
			render(view:"creer", model:['projet':projet, 'responsable':responsable])
		}
	}
	
	def editer = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		Participant responsable = persistenceManager.getObjectById(Participant.class, projet.responsable)
		
		def transaction = persistenceManager.currentTransaction()
		
		try {
			transaction.begin()
			projet = persistenceManager.detachCopy(projet)
			responsable = persistenceManager.detachCopy(responsable)
			transaction.commit()
			
			render(view:"editer", model:['projet':projet, 'responsable':responsable])
		} catch(Exception e) {
			if (transaction.isActive()) { transaction.rollback(); }
			redirect('action':editer)
		}
	}
	
	def sauver = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		Participant responsable = persistenceManager.getObjectById(Participant.class, projet.responsable)
		
		projet.nom = params.nomProjet		
		responsable.nom = params.nom
		responsable.email = params.email
		
		def transaction = persistenceManager.currentTransaction()
		
		try {
			transaction.begin()
			persistenceManager.makePersistent(projet)
			persistenceManager.makePersistent(responsable)
			transaction.commit()
		
			redirect(controller:'participant', action:'liste')
		} catch(Exception e) {
			if (transaction.isActive()) { transaction.rollback(); }
		}		
	}
	
	def supprimer = {
		def projetKey = KeyFactory.stringToKey(session.projetKey)
		Projet projet = persistenceManager.getObjectById(Projet.class, projetKey)
		
		def transaction = persistenceManager.currentTransaction()
		
		try {
			transaction.begin()
			persistenceManager.deletePersistent(projet)
			transaction.commit()
		
			session.projetKey = null
			redirect('action':accueil)
		} catch(Exception e) {
			if (transaction.isActive()) { transaction.rollback(); }
			redirect('action':editer)
		}
	}
}